//
// BlockingStream.cpp for BlockingStream in /home/mambou_j//babel-2014
// 
// Made by jacquesquentin mamboumouafo
// Login   <mambou_j@epitech.net>
// 
// Started on  Mon May 14 22:44:25 2012 jacquesquentin mamboumouafo
// Last update Mon May 14 23:20:27 2012 jacquesquentin mamboumouafo
//


#include	"BlockingStream.hpp"

#include	"portaudio.h"
#include	"StreamParameters.hpp"
#include	"Exception.hpp"

namespace	portaudio
{

  BlockingStream::BlockingStream()
  {
  }

  BlockingStream::BlockingStream(const StreamParameters &parameters)
  {
    open(parameters);
  }

  BlockingStream::~BlockingStream()
  {
	try
	  {
	    close();
	  }

	catch (...)
	  {
	  }
  }

  void	BlockingStream::open(const StreamParameters &parameters);
  {
    PaError	err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), NULL, NULL);

    if (err != paNoError)
      {
	throw PaException(err);
      }
  }

  void	BlockingStream::read(void *buffer, unsigned long numframes)
  {
    PaError	err = Pa_ReadStream(stream_, buffer, nmFrames);

    if (err != paNoError)
      {
	throw PaException(err);
      }
  }

  void	BlockingStream::write(const void *buffer, unsigned long numframes)
  {
    PaError	err = Pa_WriteStream(stream_, buffer, numFrames);

    if (err != paNoError)
      {
	throw PaException(err);
      }
  }

  signed	long	BlockingStream::availableReadSize() const
  {
    signed	long	avail = Pa_GetStreamReadAvailable(stream_);

    if (avail < 0)
      {
	throw PaException(avail);
      }

    return avail;
  }

  signed	long	BlockingStream::availableWriteSize() const
  {
    signed	long	avail = Pa_GetStreamWriteAvailable(stream_);

    if (avail < 0)
      {
	throw PaException(avail);
      }

    return avail;
  }
}
